home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Lib / util / pe_fragment.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  1.9 KB  |  108 lines

  1. /* pe_fragment.c: break up big pe_strings into smaller ones */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Lib/util/RCS/pe_fragment.c,v 6.0 1991/12/18 20:25:18 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Lib/util/RCS/pe_fragment.c,v 6.0 1991/12/18 20:25:18 jpo Rel $
  9.  *
  10.  * $Log: pe_fragment.c,v $
  11.  * Revision 6.0  1991/12/18  20:25:18  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include <isode/psap.h>
  19.  
  20. static int pe_frag_aux ();
  21.  
  22. int pe_fragment (pe, maxsize)
  23. PE    pe;
  24. int    maxsize;
  25. {
  26.     PE    p;
  27.  
  28.     switch (pe -> pe_form) {
  29.         case PE_FORM_ICONS:
  30.         return OK;
  31.  
  32.         case PE_FORM_CONS:
  33.         switch (pe -> pe_id) {    /* dont refragment yet... */
  34.             case PE_PRIM_OCTS:
  35.             case PE_PRIM_BITS:
  36.             case PE_DEFN_IA5S:
  37.             return OK;
  38.         }
  39.  
  40.         for (p = pe -> pe_cons; p; p = p -> pe_next)
  41.             if (pe_fragment (p, maxsize) == NOTOK)
  42.                 return NOTOK;
  43.  
  44.         return OK;
  45.  
  46.         case PE_FORM_PRIM:
  47.         return pe_frag_aux (pe, maxsize);
  48.  
  49.     }
  50.     return OK;
  51. }
  52.  
  53. static int pe_frag_aux (pe, maxsize)
  54. PE    pe;
  55. int    maxsize;
  56. {
  57.     char    *cp;
  58.     PE    last, p;
  59.     int    size, n;
  60.  
  61.     if (pe -> pe_len == PE_LEN_INDF)
  62.         return OK;
  63.     if (pe -> pe_len < maxsize)
  64.         return OK;
  65.  
  66.     switch (pe -> pe_id) {
  67.         case PE_PRIM_OCTS:
  68.         case PE_DEFN_IA5S:
  69.         cp = (char *) pe -> pe_prim;
  70.         pe -> pe_form = PE_FORM_CONS;
  71.         last = NULLPE;
  72.         size = pe->pe_len;
  73.         pe -> pe_len = 0;
  74.         pe -> pe_prim = NULLPED;
  75.         while (size > 0) {
  76.             n = size > maxsize ? maxsize : size;
  77.             p = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM,
  78.                       PE_PRIM_OCTS);
  79.             if (pe == NULLPE)
  80.                 return NOTOK;
  81.             if ((p -> pe_prim = PEDalloc (n)) == NULLPED) {
  82.                 pe_free(p);
  83.                 return NOTOK;
  84.             }
  85.             p -> pe_len = n;
  86.             PEDcpy (cp, p -> pe_prim, n);
  87.             if (last == NULLPE) {
  88.                 if (seq_add (pe, p, -1) == NOTOK)
  89.                     return NOTOK;
  90.             }
  91.             else {
  92.                 if (seq_addon (pe, last, p) == NOTOK)
  93.                     return NOTOK;
  94.             }
  95.             cp += n;
  96.             size -= n;
  97.             last = p;
  98.         }
  99.         break;
  100.  
  101.         default:
  102.         break;
  103.     }
  104.     return OK;
  105. }
  106.         
  107.         
  108.